package com.zto.sch.advance.caffeine;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;

import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

/**
 * @program: sch-diy-parent
 * @description:手动加载
 * @author: sch
 * @create: 2020-12-10 13:08
 **/
public class CaffineDemoShouDou {
    public static void main(String[] args) throws InterruptedException {
        Cache<String, String> cache = Caffeine.newBuilder()
                // 基于时间失效,写入之后开始计时失效
                .expireAfterWrite(2000, TimeUnit.MILLISECONDS)
                // 缓存容量
                .maximumSize(5)
                .build();

        // 使用java8 Lambda表达式声明一个方法,get不到缓存中的值调用这个方法运算、缓存、返回
//        Function function = key -> key + "_" + System.currentTimeMillis();
        Function function = (k) -> {
            long currentTimeMillis = System.currentTimeMillis();

            return "zto_" + currentTimeMillis;
        };

        String value = cache.get("key", function);
        System.out.println(value);

        //让缓存到期
        Thread.sleep(2001);
        // 存在就取,不存在就返回空
        System.out.println(cache.getIfPresent("key"));

        // 重新存值：最终调用ConcurrentHashMap.putIfAbsent方法存入数据。value是Node对象
        cache.put("key2", "hello world");
        String key = cache.get("key", function);
        System.out.println(key);


        // 获取所有值打印出来
        ConcurrentMap<String, String> concurrentMap = cache.asMap();
        System.out.println(concurrentMap);

        // 删除key:最终调ConcurrentHashMap.computeIfPresent。
        // 而这个方法返回null，达到清空缓存的效果
        cache.invalidate("key");
        // 获取所有值打印出来
        System.out.println(cache.asMap());

    }


}
